# import marimo as mo


import matplotlib.pyplot as plt
import matplotlib as mpl

# 设置字体为系统默认字体 (需要系统已安装合适的中文字体)
# 但依赖于你的系统是否安装了合适的中文字体，并且可能在不同系统上效果不一致。
mpl.rcParams['font.sans-serif'] = ['Noto Sans CJK HK, Bold']  # SimHei是常用的中文宋体字体
# mpl.rcParams['font.sans-serif'] = ['WenQuanYi']

mpl.rcParams['axes.unicode_minus'] = False  # 用来正常显示负号
#%%查看matplotlib字体

from matplotlib import font_manager

fonts = sorted([f.name for f in font_manager.fontManager.ttflist])
for font in fonts:
    print(font)

#%%
# 横坐标与实际值对不上
# %matplotlib

squares = [1, 4, 9, 16, 25]


# 实例fig 表示整张图片。实例ax 表示图片中的各个图表，
_fig, _ax = plt.subplots()
_ax.plot(squares)

plt.show()


#%%

# 横坐标与实际值对不上




_fig, _ax = plt.subplots()
_ax.plot(squares, linewidth=3)

_ax.set_title('平方数', fontsize=24)

# _ax.set_title('aas', fontsize=24)
_ax.set_xlabel('值', fontsize=14)
_ax.set_ylabel('值的平方', fontsize=14)

_ax.tick_params(axis='both', labelsize=14)

plt.show()

#%%

input_vals = [1,2,3,4,5]



_fig, _ax = plt.subplots()
_ax.plot(input_vals, squares, linewidth=3)

_ax.set_title('平方数', fontsize=24)
_ax.set_xlabel('值', fontsize=14)
_ax.set_ylabel('值的平方', fontsize=14)

_ax.tick_params(axis='both', labelsize=14)

plt.show()

#%%

# 内置样式

plt.style.available

#%%

# 设定样式后,字体报错
# plt.style.use('seaborn-v0_8')
# plt.style.use('bmh')
# plt.style.use('classic')


_fig, _ax = plt.subplots()
_ax.plot(input_vals, squares, linewidth=3)

_ax.set_title('平方数', fontsize=24)
_ax.set_xlabel('值', fontsize=14)
_ax.set_ylabel('值的平方', fontsize=14)

_ax.tick_params(axis='both', labelsize=14)

plt.show()

#%%

plt.colormaps

#%%

_fig, _ax = plt.subplots()

x_vals = [1, 2, 3, 4, 5]
y_vals = [1, 4, 9, 16, 25]

_ax.scatter(x_vals, y_vals, s=100)

_ax.set_title('平方数', fontsize=24)
_ax.set_xlabel('值', fontsize=14)
_ax.set_ylabel('值的平方', fontsize=14)



# which='major': 这个参数表示只修改 主要 刻度。 Matplotlib 通常会显示主要刻度和次要刻度（主要刻度之间的较小刻度）。 使用 'minor' 会影响次要刻度，'both' 会影响两者。
_ax.tick_params(axis='both', which='major', labelsize=14)


plt.show()

#%%

_x_vals = range(1001)
_y_vals = [x**2 for x in _x_vals]

_fig, _ax = plt.subplots()

# _ax.scatter(_x_vals, _y_vals, s=10, c='red')
_ax.scatter(_x_vals, _y_vals, s=10, edgecolors='none', c=_y_vals, cmap=plt.cm.Blues)


_ax.set_title('平方数', fontsize=24)
_ax.set_xlabel('值', fontsize=14)
_ax.set_ylabel('值的平方', fontsize=14)

# _ax.tick_params(axis='both', which='major', labelsize=14)

# 设置每个坐标轴的取值范围
_ax.axis([0, 1100, 0, 1_100_000])


plt.show()

#%%

import random 

class R_walk:

    # 新实例默认5000步
    def __init__(self, num_poina=5000):
        self.num_poin = num_poina

        #随机移动从(0, 0)开始,将后面每一步存入列表
        self.x_val = [0]
        self.y_val = [0]



    def fill_walk(self):


        # 步数等于预定步数,结束循环
        while len(self.x_val) < self.num_poin:


            # x轴方向,从[1, -1]中随机选取一个
            x_dir = random.choice([1, -1])
            x_dist = random.choice([0, 1, 2, 3, 4])        # 每一步长度0-4之间
            x_step = x_dir * x_dist

            y_dir = random.choice([1, -1])
            y_dist = random.choice([0, 1, 2, 3, 4])
            y_step = y_dir * y_dist

            # 2个方向的步长均为0,则跳过
            if x_step == 0 and y_step == 0:
                continue



            # x值等于前一个值和步长相加
            x = self.x_val[-1] + x_step         
            y = self.y_val[-1] + y_step


            self.x_val.append(x)
            self.y_val.append(y)




# 单次漫步
rw = R_walk()

rw.fill_walk()
_fig, _ax = plt.subplots()
_ax.scatter(rw.x_val, rw.y_val, s=15, edgecolors='none')


plt.show()


#%%

# 根据输入执行漫步
# app = mo.App()
# app.show(fig, mode="external")
while True:
    _rw = R_walk(50_000)

    _rw.fill_walk()

    # 指定图大小,单位in
    _fig, _ax = plt.subplots(figsize=(15, 9))
    _point_numbers = range(_rw.num_poin)
    _ax.scatter(_rw.x_val, _rw.y_val, s=1, edgecolors='none', c=_point_numbers, cmap=plt.cm.Blues)


    # 设置起点颜色
    _ax.scatter(0, 0, s=50, edgecolors='none', c='green')

    # 设置终点颜色
    _ax.scatter(_rw.x_val[-1], _rw.y_val[-1], s=50, edgecolors='none', c='red') 


    # 隐藏坐标轴
    _ax.get_xaxis().set_visible(False)
    _ax.get_yaxis().set_visible(False)


    plt.show()


    keep_running = input('再行走一次么? (y/n): ')
    if keep_running == 'n':
        break
    
    
#%%

